// M3U8 Crawler 内容脚本

// 监听来自background script的消息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.type === 'NEW_M3U8_FOUND') {
    console.log('内容脚本收到新的M3U8文件:', message.data.url);
    // 可以在这里做一些UI提示或其他处理
  }
});

// 页面加载完成后执行
window.addEventListener('load', () => {
  // 扫描页面中的video和source标签，查找可能的M3U8播放源
  scanMediaElements();
  
  // 监控动态添加的媒体元素
  observeDynamicContent();
});

// 扫描页面中的媒体元素
function scanMediaElements() {
  const mediaElements = document.querySelectorAll('video, audio');
  
  mediaElements.forEach(element => {
    // 检查直接的src属性
    if (element.src && (element.src.includes('.m3u8') || element.src.includes('.m3u'))) {
      reportM3U8Url(element.src);
    }
    
    // 检查source子元素
    const sourceElements = element.querySelectorAll('source');
    sourceElements.forEach(source => {
      if (source.src && (source.src.includes('.m3u8') || source.src.includes('.m3u'))) {
        reportM3U8Url(source.src);
      }
    });
    
    // 尝试获取mediaElement的currentSrc属性
    try {
      if (element.currentSrc && (element.currentSrc.includes('.m3u8') || element.currentSrc.includes('.m3u'))) {
        reportM3U8Url(element.currentSrc);
      }
    } catch (e) {
      console.warn('无法访问currentSrc属性:', e);
    }
  });
  
  // 扫描页面中的iframe，查找可能嵌入的视频播放器
  scanIframes();
}

// 扫描iframe
function scanIframes() {
  const iframes = document.querySelectorAll('iframe');
  
  iframes.forEach(iframe => {
    try {
      // 尝试获取iframe的src
      if (iframe.src && (iframe.src.includes('.m3u8') || iframe.src.includes('.m3u'))) {
        reportM3U8Url(iframe.src);
      }
      
      // 注意：由于同源策略，我们通常无法访问iframe内部的DOM
      // 这里只是记录iframe的src，让background script通过webRequest进一步监控
    } catch (e) {
      console.warn('无法访问iframe属性:', e);
    }
  });
}

// 监控动态添加的内容
function observeDynamicContent() {
  const observer = new MutationObserver((mutations) => {
    mutations.forEach(mutation => {
      // 检查新添加的节点
      mutation.addedNodes.forEach(node => {
        if (node.nodeType === 1) { // 元素节点
          // 如果是媒体元素或包含媒体元素
          if (node.tagName === 'VIDEO' || node.tagName === 'AUDIO') {
            checkMediaElementForM3U8(node);
          } else {
            // 检查节点内的媒体元素
            const mediaElements = node.querySelectorAll('video, audio, source');
            mediaElements.forEach(element => {
              checkMediaElementForM3U8(element);
            });
            
            // 检查节点内的iframe
            const iframes = node.querySelectorAll('iframe');
            iframes.forEach(iframe => {
              if (iframe.src && (iframe.src.includes('.m3u8') || iframe.src.includes('.m3u'))) {
                reportM3U8Url(iframe.src);
              }
            });
          }
        }
      });
      
      // 检查属性变化，特别是src属性
      mutation.attributeName && mutation.target && 
      (mutation.attributeName === 'src' || mutation.attributeName === 'href') &&
      (mutation.target.tagName === 'VIDEO' || mutation.target.tagName === 'AUDIO' || 
       mutation.target.tagName === 'SOURCE' || mutation.target.tagName === 'IFRAME') &&
      checkMediaElementForM3U8(mutation.target);
    });
  });
  
  // 开始观察文档变化
  observer.observe(document.body, {
    childList: true,
    subtree: true,
    attributes: true,
    attributeFilter: ['src', 'href']
  });
}

// 检查媒体元素是否包含M3U8 URL
function checkMediaElementForM3U8(element) {
  if (element.src && (element.src.includes('.m3u8') || element.src.includes('.m3u'))) {
    reportM3U8Url(element.src);
  }
  
  // 对于video和audio元素，尝试获取currentSrc
  if ((element.tagName === 'VIDEO' || element.tagName === 'AUDIO') && 
      element.currentSrc && (element.currentSrc.includes('.m3u8') || element.currentSrc.includes('.m3u'))) {
    reportM3U8Url(element.currentSrc);
  }
}

// 向background script报告发现的M3U8 URL
function reportM3U8Url(url) {
  chrome.runtime.sendMessage({
    type: 'REPORT_M3U8_URL',
    url: url
  });
}

// 导出函数，供其他脚本调用（如果需要）
window.M3UCrawler = {
  refreshScan: scanMediaElements,
  getDetectedUrls: function() {
    // 返回检测到的URL列表（需要与background通信）
    chrome.runtime.sendMessage({ type: 'GET_M3U8_FILES' }, (response) => {
      return response.m3u8Files || [];
    });
  }
};